﻿using System;
using SoftwareConsulting.BI11.NumericalMethods.Interfaces;

namespace SoftwareConsulting.BI11.NumericalMethods.Interpolation
{
    /// <summary>
    /// Класс интерполяции Ньютона
    /// </summary>
    /// <remarks>
    /// Входные параметры:
    /// X   -   абсциссы точек;                    
    /// F   -   значения функций в этих точках;                    
    /// N   -   число точек;
    /// T   -   точка, в которой осуществляется интерполяция
    /// Результат:
    /// значение интерполяционного полинома в точке T
    /// </remarks>
    public class NewtonInterpolation 
    {
        private double _result;

        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>        
        public NewtonInterpolation(double[] x, double[] f, int n, double t)
        {
            _result = 0;
            double F = 0;
            double XX = 1;
            double X = 1;
            double LN = f[0];
            for (int i = 1; i < n; i++)
            {
                X *= (t - x[i - 1]);
                F = 0;
                XX = 1;
                for (int j = 0; j <= i; j++)
                {
                    for (int k = 0; k <= i; k++)
                    {
                        if (k != j)
                            XX *= x[j] - x[k];
                    }
                    F += f[j] / XX;
                }
                LN += X * F;
            }
            _result = LN;
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double GetSolution()
        {
            return _result;
        }
    }
}
